#!/usr/bin/enr/python3
# -*- coding: utf-8 -*-
# -------------------------------
# @Author : hurong
# @File : day04.py
# @Time : 2025/3/30 14:31
# -------------------------------

"""
循环结构
Python 内置time模块的sleep函数可以实现程序的休眠，
参数1表示休眠的秒数，可以使用int或float类型，例如0.05表示50毫秒
"""
import time
print('hello, world')
time.sleep(1)

"""
for-in 循环
eg: 每隔1秒输出一次‘hello，world’,持续1小时
"""
# #for i in range(3600):   # range(3600)可以构造出一个从0到3599的范围
# for _ in range(3600):
# # 上面代码的输出操作和休眠操作都没有用到循环变量i,对于不需要用到循环变量的for-in循环结构，根据python编程管理，通常把循环变量命名为_
#     print('hello,world')
#     time.sleep(1)

"""
range(101)：可以用来产生0到100范围的整数，需要注意的是取不到101。
range(1, 101)：可以用来产生1到100范围的整数，相当于是左闭右开的设定，即[1, 101)。
range(1, 101, 2)：可以用来产生1到100的奇数，其中2是步长（跨度），即每次递增的值，101取不到。
range(100, 0, -2)：可以用来产生100到1的偶数，其中-2是步长（跨度），即每次递减的值，0取不到。
"""
# 从1到100的整数求和
total = 0
for i in range(1,101):
    total += i
print(f"1到100的整数和：{total}")

# 从1到100的偶数求和
total = 0
for i in range(1,101):
    if i % 2 == 0:
        total += i
print(f"1到100的偶数和为：{total}")


# 方法二：从1到100的偶数求和
total = 0
for i in range(2,101,2):
    total += i
print(f"1到100的偶数和为：{total}")

# 方法三：python内置函数sum求和
print(sum(range(2, 101, 2)))

"""
while 循环
如果要构造循环结构但是又不能确定循环重复的次数，推荐用while循环。
while循环通过布尔值或能产生布尔值的表达式来控制循环，表达式值为True，循环体就会被重复只想，
当表达式的值为False时，结束循环
"""
total = 0
i = 1
while i <= 100:
    total += i
    i += 1
print(total)

"""
break 和continue
break: 中止循环结构的执行，只能中止它所在的哪个循环
continue：它可以用来放弃本次循环后续的代码直接让循环进入下一轮。
"""
total = 0
for i in range(1, 101):
    if i % 2 != 0:
        continue
    total += i
print(f"1到100的偶数求和：{total}")

total = 0
i = 2
while True:
    total += i
    i += 2
    if i > 100:
        break
print(f"break 循环算总和：{total}")

"""
嵌套的循环结构
"""
print(25 * "*" + "九九乘法表" + 25 * '*')
# 打印乘法口诀表
for i in range(1, 10):
    for j in range(1, i + 1):
        print(f'{i} * {j}',end='\t')
    print()


# 循环结构的应用
"""
例子1：判断素数
要求输入一个大于1 的正整数，判断它是不是素数
"""
num = int(input('请输入一个正整数：'))
end = int(num ** 0.5)
is_prime = True
for i in range(2,end + 1):
    if num % i == 0:
        is_prime = False
        break
if is_prime:
    print(f'{num}是素数')
else:
    print(f'{num}不是素数')

"""
例子2：最大公约数
要求：输入两个大于 0 的正整数，求两个数的最大公约数。
"""
# 用上面代码的找最大公约数在执行效率是有问题的。假如x的值是999999999998，y的值是999999999999，
# 很显然两个数是互质的，最大公约数为 1。但是我们使用上面的代码，循环会重复999999999998次，这通常是难以接受的。
# x = int(input('x = '))
# y = int(input('y = '))
# for i in range(x, 0, -1):
#     if x % i == 0 and y % i == 0:
#         print(f"最大公约数：{i}")
#         break

# 欧几里得算法
x = int(input('x = '))
y = int(input('y = '))
while y % x != 0:
    x, y = y % x, x
print(f'最大公约数：{x}')

"""猜数字游戏
计算机出一个 1 到 100 之间的随机数，玩家输入自己猜的数字，计算机给出对应的提示信息“大一点”、“小一点”或“猜对了”，
如果玩家猜中了数字，计算机提示用户一共猜了多少次，游戏结束，否则游戏继续。
"""
import random
answer = random.randrange(1,101)
counter = 0
while True:
    counter += 1
    num = int(input('请输入：'))
    if num < answer:
        print('大一点。')
    elif num > answer:
        print('小一点。')
        break
    else:
        print(f'你一共猜了{counter}次。')

"""
总结：for和while的区别
1. 事先知道循环结构重复的次数，我们通常使用for循环；如果循环结构的重复次数不能确定，可以用while循环
2. 循环结构中使用break终止循环，也可以在循环结构中使用continue关键字让循环结构直接进入下一轮次。
"""

